package cfg

import (
	"flag"
	"fmt"
	"log"
	"os"
	"strings"
	"time"
)

type Config struct {
	Path,
	Urls,
	Name,
	FileUrls,
	LogFile string

	Convert,
	Crop,
	Scale,
	Square,
	Override,
	AllEditOptions,
	Help bool
}

func NewConfig() Config {
	c := Config{}

	flag.StringVar(&c.Path, "p", "", "Куда складывать картинки")
	flag.StringVar(&c.Urls, "u", "", "Список ссылок на картинки, разделённых пробелом, прим: -u='https://link1.png https://link/2.webm'")
	flag.StringVar(&c.Name, "n", "", "Шаблон, по которому будут именоваться файлы. Например, если задать 'result', то имена файлов будут 'result-01.jpg', 'result-02.jpg' и т.д.")
	flag.StringVar(&c.FileUrls, "f", "", "Файл, откуда программа будет брать ссылки, разделённые символом новой строки")
	flag.StringVar(&c.LogFile, "d", "", "Если ввести имя файла, то программа будет логгировать каждый шаг в указанный файл.")

	flag.BoolVar(&c.Convert, "jpg", false, "Нужно ли конверитировать в jpg?")
	flag.BoolVar(&c.Crop, "crop", false, "Нужно ли делать обрезку?")
	flag.BoolVar(&c.Scale, "scale", false, "Большая сторона масштабируется до 600 пикселей, другая сторона в столько же раз, что и большой")
	flag.BoolVar(&c.Square, "square", false, "Сделать картинку квадратной, отцентрировав контент посередине")
	flag.BoolVar(&c.Override, "y", false, "Перезаписывать файлы")
	flag.BoolVar(&c.AllEditOptions, "full", false, "Использовать все операции редактирования")

	flag.Parse()

	if c.AllEditOptions {
		c.Convert = true
		c.Crop = true
		c.Scale = true
		c.Square = true
	}

	if c.Name == "" {
		c.Name = "result"
	}

	if c.LogFile == "" {
		currTime := time.Now()
		dirName := "__endow_logs"
		logFileName := fmt.Sprintf("endow__%d-%d-%d__%d-%d-%d.log", currTime.Year(), currTime.Month(), currTime.Day(), currTime.Hour(), currTime.Minute(), currTime.Second())
		c.LogFile = dirName + string(os.PathSeparator) + logFileName

		os.Mkdir(dirName, 0754)
	}

	return c
}

func (c Config) GetURLList() ([]string, int, error) {
	var (
		urlList   []string
		err       error
		itemCount int
	)

	if c.Urls == "" {
		urlList, itemCount, err = parseFileURLs(c.FileUrls)
	} else {
		urlList = strings.Split(c.Urls, " ")
		for i, item := range urlList {
			urlList[i], _ = strings.CutSuffix(item, "\\r")
			itemCount++
		}
	}

	return urlList, itemCount, err
}

func (c Config) Logging() (logFile *os.File, err error) {
	logFile, err = os.Create(c.LogFile)

	if err == nil {
		log.SetOutput(logFile)
		log.Println("Вывод лога перенаправлен в", c.LogFile)
	} else {
		log.Fatalln("Ошибка при создании файла лога", err)
	}
	return
}

func parseFileURLs(urlStr string) (urlList []string, itemCount int, err error) {
	file, err := os.ReadFile(urlStr)
	if err != nil {
		return nil, 0, err
	}
	urlList = strings.Split(string(file), "\n")

	if urlList[len(urlList)-1] == "" {
		urlList = urlList[:len(urlList)-1]
	}

	for i, item := range urlList {
		urlList[i], _ = strings.CutSuffix(item, "\r")
		itemCount++
	}
	return
}

func GenerateLogFileNames(count int, basename string) (logSlice []string) {
	for i := 0; i < count; i++ {
		logSlice = append(logSlice, fmt.Sprintf("%s__%.2d", basename, i))
	}
	return
}
